<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
function cube (num) {
	var arr = [[0,1],[1,0],[0,-1],[-1,0]]; // 候选方向 右 下 左 上
	var res = []; // 待输出结果
	var curr = [0,0]; // 当前位置
	var count = 1; // 计数器
	// 初始化二维数组
	for(var i = 0; i < num; i++){
		res[i] = [];
		for(var j = 0; j < num; j++){
			res[i][j] = 0;
		}
	}
	res[0][0] = 1
	while(walk()){} // 直到走完之前执行循环
	console.table(res) // 输出结果
	return res
	function walk () {
		// 依次尝试候选方向
		for(var i = 0; i < 4; i++){
			var y = curr[0] + arr[i][0];
			var x = curr[1] + arr[i][1];
			// 前方位置是 0 并且在数组范围内可以行走
			if( x >= 0 && x < num && y >= 0 && y < num && res[y][x] === 0){
				res[y][x] = ++count; // 赋值并自增计数器
				// 移动位置
				curr[0] = y;
				curr[1] = x;
				(i !== 0) && arr.push(arr.shift());	// 顺时针轮换一次方向
				return true; // 可以行走
			}
		}
		return false; // 不能行走终止while循环
	}
}
cube(5)
// function cube (num) {
// 	var arr = [[0,1],[1,0],[0,-1],[-1,0]]
// 	var res = []
// 	var curr = [0,0]
// 	var count = 1
// 	for(var i = 0; i < num; i++){
// 		res[i] = []
// 		for(var j = 0; j < num; j++){
// 			res[i][j] = 0
// 		}
// 	}
// 	res[0][0] = 1
// 	while(walk()){}
// 	console.table(res)
// 	return res
// 	function walk () {
// 		for(var i = 0; i < 4; i++){
// 			var y = curr[0] + arr[i][0]
// 			var x = curr[1] + arr[i][1]
// 			if( x >= 0 && x < num && y >= 0 && y < num && res[y][x] === 0){
// 				res[y][x] = ++count
// 				curr[0] = y
// 				curr[1] = x
// 				;(i !== 0) && arr.push(arr.shift())
// 				return true
// 			}
// 		}
// 		return false
// 	}
// }
// cube(5)
		</script>
	</body>
</html>
